home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
SGI Developer Toolbox 6.1
/
SGI Developer Toolbox 6.1 - Disc 4.iso
/
public
/
bit
/
src
/
ulib
/
msleep.c
< prev
next >
Wrap
C/C++ Source or Header
|
1994-08-01
|
2KB
|
108 lines
/***********************************************************************
* $Id: msleep.c,v 0.80 1994/02/24 09:48:11 zhao Exp $
*
*. Copyright(c) 1993,1994 by T.C. Zhao
* All rights reserved.
*.
* malarm and msleep are same as alarm(3C) and sleep(3C)
* but with milliseconds resolution (or tries to be). If
* using sginap, about 10msec.
*
***********************************************************************/
#if !defined(lint) && defined(F_ID)
char *id_mslep = "$Id: msleep.c,v 0.80 1994/02/24 09:48:11 zhao Exp $";
#endif
#include <stdio.h>
#include "unistd.h"
#include <sys/time.h>
#include "ulib.h"
#define USE_SGI_NAP /* better than mine */
#ifdef USE_SGI_NAP
#include <limits.h> /* For CLK_TCK */
/* This is not necessary on SGI machines, useful for dry compile
* on other machines */
#ifndef CLK_TCK
#define CLK_TCK 100
#endif
unsigned
msleep(unsigned msec)
{
long ntics = (msec * CLK_TCK) / 1000;
sginap(ntics ? ntics : 1);
return 0;
}
#else /* use my own hack */
#define RET_TYPE void /* BSD signal handler returns int */
#define RET_VAL /* if type is int, define it to 0 */
unsigned
malarm(unsigned msecs)
{
register unsigned sec = msecs / 1000, usec = (msecs % 1000) * 1000;
struct itimerval timer, otimer;
timer.it_value.tv_sec = sec;
timer.it_value.tv_usec = usec;
timer.it_interval.tv_sec = 0;
timer.it_interval.tv_usec = 0;
if (setitimer(ITIMER_REAL, &timer, &otimer))
perror("setitimer");
return (otimer.it_value.tv_sec * 1000 + otimer.it_value.tv_usec / 1000);
}
#include <signal.h>
#include <setjmp.h>
static jmp_buf jmpbuf;
static RET_TYPE(*osighandler) (int);
static RET_TYPE
trapalarm(int sig)
{
if (sig != SIGALRM)
(void) fprintf(stderr, "Unexpected signal in msleep: %d\n", sig);
/* return anyway */
(void) signal(SIGALRM, osighandler);
longjmp(jmpbuf, 1);
return RET_VAL;
}
static unsigned remaining;
unsigned
msleep(unsigned msec)
{
if (msec == 0)
return 0;
/*
* save old alarm handler, which is restored by the new handler when it
* returns
*/
osighandler = signal(SIGALRM, trapalarm);
if (setjmp(jmpbuf) != 0) /* alarm has expired */
return remaining;
remaining = malarm(msec);
pause();
return 0;
}
#endif